\\ *** EDWINDOW.SCR *** 14sep86we Dieses File enthält das Editorfenster. Es kann als Beispiel für die Programmierung eines eigenen Fensters benutzt werden. \ Window-Handling Loadscreen 30oct86we Onlyforth Gem also definitions 1 7 +thru \ VDI-Functions for window 24aug86we : bar ( x1 y1 x2 y2 -- ) ptsin 4 array! 1 function ! &11 2 0 VDI ; : swr_mode ( mode -- ) intin ! &32 0 1 VDI ; : sf_interior ( style -- ) intin ! &23 0 1 VDI ; : sf_style ( styleindex -- ) intin ! &24 0 1 VDI ; : sf_color ( color -- ) intin ! &25 0 1 VDI ; : sf_perimeter ( pervis -- ) intin ! &104 0 1 VDI ; : fbox ( x1 y1 x2 y2 -- ) 1 swr_mode 1 sf_interior 0 sf_color 0 sf_perimeter bar ; \ save and restore the screen 10sep86we ?head @ 1 ?head ! Create memMFDB2 7 , 0 , &640 , &400 , &40 , 0 , 1 , 0 , 0 , 0 , memMFDB2 scr>mem scr>mem2 ( Xleft Ytop Width Heigth -- ) memMFDB2 mem>scr mem2>scr ( Xleft Ytop Width Heigth -- ) : save_screen 0 0 cwidth &80 * cheight &25 * scr>mem2 ; : restore_screen 0 0 cwidth &80 * cheight &25 * mem2>scr ; \ Windowcomponents and Windowsize 30aug86we :name :move + :info + :uparrow + :dnarrow + :vslide + Constant wi_components : wi_x ( -- n ) dx cwidth * ; : wi_y ( -- n ) dy cheight * ; : wi_width ( -- n ) c/l cwidth * ; : wi_height ( -- n ) l/s cheight * ; : wi_size ( -- wx wy wwidth wheight ) 0 wi_components wi_x 1- wi_y 1- wi_width 2+ wi_height 2+ wind_calc intout 2+ 4@ ; \ Window's title and sliders 25sep86we Variable wi_handle : wi_string ( 0string function# -- ) swap >r wi_handle @ swap r> >absaddr swap 0 0 wind_set ; : wi_title ( 0string -- ) :wf_name wi_string ; : wi_status ( 0string -- ) :wf_info wi_string ; : vslide_size wi_handle @ :wf_vslize &1000 capacity / 0 0 0 wind_set ; : vslide ( scr# -- ) wi_handle @ :wf_vslide rot &1000 capacity dup 1- IF 1- THEN */ 0 0 0 wind_set ; \ Draw window on screen 30aug86we : small_big ( -- sx sy sw sh bx by bw bh ) little 4@ wi_size ; : growbox small_big graf_growbox ; : shrinkbox small_big graf_shrinkbox ; : wi_clear wi_x 1- wi_y 1- over wi_width 1+ + over wi_height 1+ + fbox ; \ Open and close window 30aug86we : wi_open ( -- ) save_screen growbox wi_components wi_size wind_create dup wi_handle ! pad dup off dup wi_title wi_status wi_size wind_open wi_clear ; : wi_close ( -- ) wi_handle @ dup wind_close wind_delete shrinkbox restore_screen ; \ redrawing the rest of screen 10sep86we : restore_rect ( x y w h -- ) 1- >r 1- r> mem2>scr ; : rect_update ( function# -- x y w h ) 0 swap wind_get intout 2+ 4@ ; : redraw_screen :wf_firstxywh rect_update BEGIN 2dup or WHILE restore_rect :wf_nextxywh rect_update REPEAT 2drop 2drop ; ?head ! 14sep86we \ Window-Handling Loadscreen 14sep86we Suchreihenfolge: Zuerst GEM, dann FORTH Gebraucht werden die Definitionen aus GEMDEFS.SCR Dieses Vokabular wird als erstes durchsucht. \ VDI-Functions for window 14sep86we Für das Fenster werden einige Funktionen aus VDI gebraucht, die auf diesem Screen zusammengestellt sind. Beschreibung siehe Beschreibung VDI (hoffentlich haben wir die schon!) Im Grunde wird nur eine Routine benutzt, mit der man ein weißes Rechteck zum Löschen des Fensterinhaltes erzeugen kann. Dies erledigt fbox \ save and restore the screen 14sep86we alle folgenden Funktionen sollen headerless kompiliert werden. Ein zweiter Speicherbereich wird gebraucht, um den Bildschirm beim Verlassen des Editors zu restaurieren. Dieses Verfahren ren ist erheblich schneller als die Neuausgabe des Bildschirms, braucht aber Speicherplatz (Wir hams ja!) Der gesamte Bildschirm wird in den dafür vorgesehenen Speicher- bereich gerettet (außerhalb des FORTH-Systems, versteht sich) Das Ganze umgekehrt stellt den Bildschirm wieder her. Diese Funktionen sind recht nützlich, weil man Werte noch sehen kann, die z.B. bei LIST weggescrollt würden. \ Windowcomponents and Windowsize 14sep86we Die Bestandteile des Fensters werden einfach aufaddiert und als Konstante zur Verfügung gestellt. linke obere Ecke des Fensters in Bildschirmkoordinaten Breite des Fensters in Bildschirmkoordinaten Höhe des Fensters in Bildschirmkoordinaten berechnet die Ausmaße des Fensters für alle weiteren Funktionen unter Zuhilfenahme von WIND-CALC. Leider liefert diese Funktion bei Breite und Höhe ein Pixel zu wenig. Digital Research allein mag wissen, warum ... \ Window's title and sliders 14sep86we Window-Handle des Fensters zur Ausgabe eines Textes in Titel- oder Infozeile Der String muß mit einer Null abgeschlossen sein. gibt 0string in der Titelzeile aus. gibt 0string in der Infozeile aus. Die Größe des vertikalen Sliders wird aus der Gesamtgröße des Files, das editiert wird, berechnet. Die Position des vertikalen Sliders wird relativ zur Gesamtgröße des Files eingestellt. \ Draw window on screen 14sep86we gibt die Größe eines kleinen Rechtecks sowie des ganzen Fensters zeichnet ein wachsendes Rechteck (nur fürs Auge ...) zeichnet ein schrumpfendes Rechteck ( s.o.) löscht den Innenraum des Fenster durch Überschreiben mit einem weißen Rechteck. \ Open and close window 14sep86we öffnet das Editorfenster: Bildschirminhalt merken Fenster erzeugen mit entsprechender Größe und Attributen Titel- und Infozeile löschen Fenster auf dem Bildschirm ausgeben und Inhalt löschen schließt das Editorfenster: Fenster vom Bildschirm und überhaupt entfernen Bildschirm restaurieren. \ redrawing the rest of screen 14sep86we Rechteck per Pixelmove restaurieren liefert die Koordinaten eines neu zu zeichnenden Rechtecks. Der Screenmanager stellt eine Liste von Rechtecken zurVerfügung, die nach einer Aktion geändert worden sind. Durch diese Liste hangelt sich die Routine hindurch und erzeugt die Rechtecke per Pixelmove (schnell) neu.